/**
 * 用于对全局过滤器进行统一管理
 */
export default class Filters {
  /**
   * 时间格式过滤
   * @param timeStr 时间参数
   * @return {string} 返回转换后的格式
   */
  static timeFormat(timeStr) {
    // 博客发布时间
    let createTime = new Date(timeStr)
    // 转化一下格式
    return createTime.toLocaleString().replaceAll('/', '-')
  }

  /**
   * 将一维菜单数组转化为树结构
   * @param menus
   * @return {*[]}
   */
  static getMenuTree(menus) {
    // 先制作一张菜单节点表
    const nodeMap = menus.reduce((map, curr) => {
      map[curr.id] = curr
      return map
    }, {})

    const result = []

    menus.forEach(menu => {
      // 先找所有的一级菜单
      if (!menu.pid) {
        return result.push(menu)
      }
      // 再查表找到子菜单的父级
      const parentNode = nodeMap[menu.pid]
      // 因为对象是引用类型 所有子节点都会直接添加到对应父节点的 children 内
      parentNode.children = [...(parentNode.children || []), menu]
    })

    return result
  }

  /**
   * 根据菜单递归列表获取动态路由列表
   * @param source 菜单列表
   * @return {*[]} 返回路由列表
   */
  static routesFormat(source) {
    const target = []

    source.forEach(item => {
      target.push({
        path: item.path,
        name: item.name,
        meta: {
          title: item.title,
          icon: item.icon,
          id: item.id,
          hasChildren: item.children && item.children.length > 0
        },
        component: () => import(`@/pages/admin/views/${item.component}`)
      })
      if (item.children && item.children.length) {
        target.push(...Filters.routesFormat(item.children))
      }
    })

    return target
  }

  /**
   * 将菜单按照 sort 字段递归排序
   * @param menuData
   * @param type 默认为升序
   */
  static sortMenu(menuData, type = 'asc') {
    menuData.sort((m1, m2) => {
      if (type === 'desc') return m2.sort - m1.sort
      return m1.sort - m2.sort
    })
    // 递归排序
    menuData.forEach(menu => {
      if (menu.children && menu.children.length) {
        Filters.sortMenu(menu.children, type)
      }
    })
  }
}
